/*
全图网一键下载！
主页 : http://www.quantuwang.cc/t/e9e2057cd6e2887d.html
链接 : li->a->href = /m/518969d87fa80580.html  加上前缀 : http://www.quantuwang.cc
图片页 : img->src=http://d.quantuwang.co/2020/04/28/20421/1.jpg
*/
package main

import "bufio"
import "net/http"
import "fmt"
import "strings"
import "os"
import "io"
import "sync"
import "time"
import "strconv"
import "path/filepath"

import "github.com/PuerkitoBio/goquery"

// global variable
var picCount int = 0
var catalogue string = "D:/gogo/pic/"
var allPicPageNum int = 41 // 页面的总图片页面数-1

func getHTMLResponse(address string)(*http.Response,error){
	// function : 通过一个网址获取该网页的html对象
	// param address : 网页链接
	// return : 一个http的返回对象
	resp,err:=http.Get(address)
	if err != nil{
		fmt.Println("请求获取html失败 :",err)
	}

	return resp,err
}

func savePic(url string,savePath string){
	// function : 保存图片到本地
	// param savePath : 图片保存路径  xxx/xxx.jpg
	// param url : 图片网上的地址
    imgPath := savePath
    imgUrl := url
    
    res, err := http.Get(imgUrl)
    if err != nil {
        fmt.Println("common function save picture error")
        return
	}
	if strings.Index(res.Status,"200")==-1{
		fmt.Println("save pictrue function return status code : ",res.Status)
		return
	}
    defer res.Body.Close()
    // 获得get请求响应的reader对象
    reader := bufio.NewReaderSize(res.Body, 64 * 1024)
    
    file, err := os.Create(imgPath)
    if err != nil {
        panic(err)
    }
    // 获得文件的writer对象
    writer := bufio.NewWriter(file)
    io.Copy(writer, reader)
}

func getPicLink(pageLink string,pageNum int,saveCate string){
	// 获取图片的链接
	var tampLink string
	var picLink string
	
	for i:=0;i<pageNum;i++{
		if i!=0{
			tampLink=pageLink+"_"+strconv.Itoa(i+1)+".html"
		}else{
			tampLink=pageLink
		}

		resp,err:=http.Get(tampLink)
		if err != nil{
			fmt.Println("获取页面报错 :",err)
			continue
		}

		//  html分析
		doc,err:=goquery.NewDocumentFromReader(resp.Body)
		if err!=nil{
			fmt.Println("HTML错误",err)
			continue
		}

		// 拿图片连接
		doc.Find("img").Each(func(i int,s *goquery.Selection){
			picLink_,isExist:=s.Attr("src")
			if isExist==true{
				if strings.Index(picLink_,"d.54mm")==-1 && strings.Index(picLink_,"1.jpg")!=-1{
					tamp:=strings.Split(picLink_,"1.")[0]
					//fmt.Println("![]("+tamp+")")
					for i=1;i<60;i++{
						picLink=strings.Join([]string{tamp,".jpg"},strconv.Itoa(i))   
						savePic(picLink,catalogue+strconv.Itoa(picCount)+".jpg")
						picCount+=1
					}
				} 
			}
			
		})
	}
}

func getLink(pageLink string,pageNum int,saveCate string,wg *sync.WaitGroup){
	// 获取图片页面的链接
	defer wg.Done()
	var tampLink string
	var picPageLink string
	
	for i:=0;i<pageNum;i++{
		if i!=0{
			tampLink=pageLink+"_"+strconv.Itoa(i+1)+".html"
		}else{
			tampLink=pageLink+".html"
		}

		resp,err:=http.Get(tampLink)
		if err != nil{
			fmt.Println("获取页面报错 :",err)
			continue
		}

		//  html分析
		doc,err:=goquery.NewDocumentFromReader(resp.Body)
		if err!=nil{
			fmt.Println("HTML错误",err)
			continue
		}
		count:=0
		// 拿图片页面连接
		doc.Find("a").Each(func(i int,s *goquery.Selection){
			picLink_,isExist:=s.Attr("href")
			if isExist==true{
				if strings.Index(picLink_,".html")!=-1{
					if count>allPicPageNum{
						return
					}
					count+=1
					picPageLink="http://www.quantuwang.cc"+picLink_
					fmt.Println("--------",picPageLink,count)
					getPicLink(picPageLink,1,"")
					time.Sleep(time.Second * 3)
				}
			}
			
		})
		
		
		//savePic(picLink,saveCate+strconv.Itoa(i)+".jpg")
	}
}

func main(){
	beforeList := map[string]int  {
		"http://www.quantuwang.cc/t/eaba1ecd7edb60f2":1,
	}
	var go_sync sync.WaitGroup
	dir, _:= filepath.Abs(filepath.Dir(os.Args[0]))
	fmt.Println("--------",dir+"/pic")
	// var catelogue string = "/lalala"
	var i int
	i=0
	for k,v:=range beforeList{
		go_sync.Add(1)
		fmt.Println(k)
		// err:=os.Mkdir(catelogue+strconv.Itoa(i),os.ModePerm)
		// if err!=nil{
		// 	fmt.Println("创建文件夹报错")
		// }
		// tampPath:=catelogue+strconv.Itoa(i)+"/"
		go getLink(k,v,"tampPath",&go_sync)
		time.Sleep(time.Second * 1)
		i++
		fmt.Println(i,"\n")
		
	}
	go_sync.Wait()
	fmt.Println("爬虫结束")
}